]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
windowPreview: Cache the boundingBox of the layout manager
authorJonas Dreßler <verdre@v0yd.nl>
Mon, 1 Feb 2021 10:51:27 +0000 (11:51 +0100)
committerMarge Bot <marge-bot@gnome.org>
Mon, 1 Feb 2021 13:12:43 +0000 (13:12 +0000)
Accessing GObject properties from JS has proven to be quite slow because
of the JS->C->JS roundtrip involved. With the WindowPreview this
actually has an impact since we're accessing those properties very often
while creating new layouts.

So cache the boundingBox and the windowCenter properties of the
WindowPreview using a this._cachedBoundingBox JS object. This might
speed up opening the overview with lots of open windows significantly.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1617>

js/ui/windowPreview.js

index 23a353ef5bff5b5e93b029298c9750999ee4e836..f6d1490a3df9197ceb32e5a3cb8eca849e655ce0 100644 (file)
@@ -231,8 +231,22 @@ var WindowPreview = GObject.registerClass({
 
         this._stackAbove = null;
 
+        this._cachedBoundingBox = {
+            x: this._windowContainer.layout_manager.bounding_box.x1,
+            y: this._windowContainer.layout_manager.bounding_box.y1,
+            width: this._windowContainer.layout_manager.bounding_box.get_width(),
+            height: this._windowContainer.layout_manager.bounding_box.get_height(),
+        };
+
         this._windowContainer.layout_manager.connect(
             'notify::bounding-box', layout => {
+                this._cachedBoundingBox = {
+                    x: layout.bounding_box.x1,
+                    y: layout.bounding_box.y1,
+                    width: layout.bounding_box.get_width(),
+                    height: layout.bounding_box.get_height(),
+                };
+
                 // A bounding box of 0x0 means all windows were removed
                 if (layout.bounding_box.get_area() > 0)
                     this.emit('size-changed');
@@ -561,23 +575,14 @@ var WindowPreview = GObject.registerClass({
     }
 
     get boundingBox() {
-        const box = this._windowContainer.layout_manager.bounding_box;
-
-        return {
-            x: box.x1,
-            y: box.y1,
-            width: box.get_width(),
-            height: box.get_height(),
-        };
+        return { ...this._cachedBoundingBox };
     }
 
     get windowCenter() {
-        const box = this._windowContainer.layout_manager.bounding_box;
-
-        return new Graphene.Point({
-            x: box.get_x() + box.get_width() / 2,
-            y: box.get_y() + box.get_height() / 2,
-        });
+        return {
+            x: this._cachedBoundingBox.x + this._cachedBoundingBox.width / 2,
+            y: this._cachedBoundingBox.y + this._cachedBoundingBox.height / 2,
+        };
     }
 
     // eslint-disable-next-line camelcase